/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package pe.edu.pucp.dp1.lectura.modelo;

//import Shared.InterseccionSalida;
//import java.lang.NullPointerException;
//import pe.edu.pucp.dp1.procesamiento.modelo.MatrizInterseccionSalida;
//import Shared.MatrizInterseccionSalida;

/**
 *
 * @author Ed
 */
public class ObjCar {

    private String placa;
    private CoordCar posAnt;//posicion anterior
    public CoordCar posAct;//posicion actual
    private CoordCar posPos;//posicion posterior
    public char sentido;// N:norte, O:oeste, S:sur, E:este X:parado o primer movimiento
    private float velocidad;
    private int countDetenido;//segundos detenido
    private boolean alarmStop;//true si ya paso el limite maximo detenido (180seg)
    private int posX = -1;//x actual    
    private int posY = -1;//y actual

    public ObjCar() {
    }

    public ObjCar(String plac) {
        setPlaca(plac);
        setPosAnt(null);
        setPosAct(null);
        setSentido('X');
        setPosX(-1);
        setPosY(-1);
        setCountDetenido(0);
        setAlarmStop(false);
    }
//
//    public char sentidoTrayecto(int dx, int dy)// dx=x1-x0 dy=y1-y0
//    {
//        char sentRetorno = 'X';
//        if (dx == 0 && dy == 00) {
//            setCountDetenido(getCountDetenido() + 1);
//            int maxParado = 180;//maximo tiempo permitido como parado
//            if (getCountDetenido() >= maxParado) {
//                setAlarmStop(true);
//            }
//        } else {
//            setCountDetenido(0);
//            setAlarmStop(false);
//            if (dx == 0 && dy > 0) {
//                sentRetorno = 'N';
//            } else if (dx == 0 && dy < 0) {
//                sentRetorno = 'S';
//            } else if (dx > 0 && dy == 0) {
//                sentRetorno = 'E';
//            } else if (dx < 0 && dy == 0) {
//                sentRetorno = 'O';
//            } else if (dx != 0 && dy != 0) {
//                sentRetorno = 'X';
//            }
//        }
//        return sentRetorno;
//    }
//
//    public boolean avanzaPunto(FileCar fileCarro, MatrizInterseccionSalida[][] semaforos)//retorna falso si no existen puntos para avanzar
//    {
//        boolean avanzo;
//        CoordCar posActual = getPosAct();
//        CoordCar pseudoSgte = fileCarro.getSgtePto(false);
//        if (pseudoSgte == null)//no hay mas puntos q recorrer
//        {
////            System.out.println("No hay mas puntos ");
//            avanzo = false;
//        } else {
//            if ((posActual == null) && (getPosX() == -1) && (getPosY() == -1))//primer movimiento del carro        
//            {
//                fileCarro.getSgtePto(true);
//                setPosAct(pseudoSgte);
//                setSentido('X');
//                setVelocidad(velocidadLimite(getPosAct().getXx(), getPosAct().getYy(), getSentido()));
//            } else {
//                int dx = pseudoSgte.getXx() - getPosAct().getXx();
//                int dy = pseudoSgte.getYy() - getPosAct().getYy();
//                char pseudoSentido = sentidoTrayecto(dx, dy);
//                int velLim = this.velocidadLimite(getPosAct().getXx(), getPosAct().getYy(), pseudoSentido);
//                int metrosEnSegundo = (velLim * 10 / 36);// factor de conversion de km/h a m/s                
//                CoordCar nuevoPto = nuevaPosicion(getPosAct(), pseudoSgte, pseudoSentido, metrosEnSegundo, semaforos);
//                if ((pseudoSgte.getXx() == nuevoPto.getXx()) && (pseudoSgte.getYy() == nuevoPto.getYy()))//nuevo punto es el mismo q el sgte punto del archivo
//                {
//                    fileCarro.getSgtePto(true);
//                }
//                setPosAct(nuevoPto);
//            }
//            avanzo = true;
//        }
//        return avanzo;
//    }
//
//    public CoordCar nuevaPosicion(CoordCar actual, CoordCar posibleSgte, char sentido, int maxMetrosAvanzar, MatrizInterseccionSalida[][] semaforos) {//aqui se utiliza la infor de choke choke
//        CoordCar nuevoPto = new CoordCar();
//        int disSem = 5;
//        int newY, newX;
//        int newYposible, newXposible;
//        switch (sentido) {
//            case 'N':
//                newY = actual.getYy() + maxMetrosAvanzar;
//                newYposible = posibleSgte.getYy();
//                nuevoPto.setXx(actual.getXx());
//                if (newY < newYposible) {
//                    if (this.esInterseccion(nuevoPto.getXx(), newY)) {
//                        newY = (this.avanzaInterseccion(actual.getXx(), newY, sentido, semaforos)) ? newY : (newY - disSem);
//                    }
//                    nuevoPto.setYy(newY);
//                } else {
//                    newYposible = (this.avanzaInterseccion(actual.getXx(), newYposible, sentido, semaforos)) ? newYposible : (newYposible - disSem);
//                    nuevoPto.setYy(newYposible);
//                }
//                break;
//            case 'S':
//                newY = actual.getYy() - maxMetrosAvanzar;
//                newYposible = posibleSgte.getYy();
//                nuevoPto.setXx(actual.getXx());
//                if (newY > newYposible) {
//                    if (this.esInterseccion(nuevoPto.getXx(), newY)) {
//                        newY = (this.avanzaInterseccion(actual.getXx(), newY, sentido, semaforos)) ? newY : (newY + disSem);
//                    }
//                    nuevoPto.setYy(newY);
//                } else {
//                    newYposible = (this.avanzaInterseccion(actual.getXx(), newYposible, sentido, semaforos)) ? newYposible : (newYposible + disSem);
//                    nuevoPto.setYy(newYposible);
//                }
//                break;
//            case 'E':
//                newX = actual.getXx() + maxMetrosAvanzar;
//                newXposible = posibleSgte.getXx();
//                nuevoPto.setYy(actual.getYy());
//                if (newX < newXposible) {
//                    if (this.esInterseccion(newX, nuevoPto.getYy())) {
//                        newX = (this.avanzaInterseccion(newX, actual.getYy(), sentido, semaforos)) ? newX : (newX - disSem);
//                    }
//                    nuevoPto.setXx(newX);
//                } else {
//                    newXposible = (this.avanzaInterseccion(newXposible, actual.getYy(), sentido, semaforos)) ? newXposible : (newXposible - disSem);
//                    nuevoPto.setXx(newXposible);
//                }
//                break;
//            case 'O':
//                newX = actual.getXx() + maxMetrosAvanzar;
//                newXposible = posibleSgte.getXx();
//                nuevoPto.setYy(actual.getYy());
//                if (newX > newXposible) {
//                    if (this.esInterseccion(newX, nuevoPto.getYy())) {
//                        newX = (this.avanzaInterseccion(newX, actual.getYy(), sentido, semaforos)) ? newX : (newX + disSem);
//                    }
//                    nuevoPto.setXx(newX);
//                } else {
//                    newXposible = (this.avanzaInterseccion(newXposible, actual.getYy(), sentido, semaforos)) ? newXposible : (newXposible + disSem);
//                    nuevoPto.setXx(newXposible);
//                }
//                break;
//            case 'X':
//                nuevoPto.setXx(posibleSgte.getXx());
//                nuevoPto.setYy(posibleSgte.getYy());
//                break;
//        }
//        return nuevoPto;
//    }
//
//    public synchronized boolean avanzaInterseccion(int x, int y, char sentido, MatrizInterseccionSalida[][] semaforos) {
//        boolean avanza = true;
//        int zonaX = (int) (x / 1000);
//        int zonaY = (int) (y / 1000);
//        int intersecX = (int) ((x - zonaX * 1000) / 100);
//        int intersecY = (int) ((y - zonaY * 1000) / 100);
//
//        if (semaforos != null) {
//            if (semaforos[zonaX][zonaY] != null) {
//            InterseccionSalida intersec = semaforos[zonaX][zonaY].getMatrizInterseccionSalida()[intersecX][intersecY];
////         System.out.println(x+" - "+y+" - "+zonaX+" - "+zonaY+" - "+intersecX+" - "+intersecY);
////        if(intersec==null)
////            System.out.println("intersec!=null"+x+" - "+y+" - "+zonaX+" - "+zonaY+" - "+intersecX+" - "+intersecY);
//
////        System.out.println(semaforos[zonaX][zonaY].getMatrizInterseccionSalida()[0][0].getEstadoVerdeEjeX()+        
////        semaforos[zonaX][zonaY].getMatrizInterseccionSalida()[0][0].getTiempoRestante()+"("+x+","+y+")\t"+sentido);
//                if(intersec!=null) {
//                    //parte semaforos
//    //        if (semaforos[zonaX][zonaY].getMatrizInterseccionSalida()[0][0] != null) {
//                    if (semaforos[zonaX][zonaY].getMatrizInterseccionSalida()[intersecX][intersecY] != null) {
////                            System.out.println("->intersec:\t"+"Estado"+intersec.getEstadoVerdeEjeX()+"Tiempo"+intersec.getTiempoRestante()+"\t("+x+","+y+")\t"+sentido);
//                        if ((((sentido == 'N') || (sentido == 'S')) && semaforos[zonaX][zonaY].getMatrizInterseccionSalida()[intersecX][intersecY].getEstadoVerdeEjeX() == 0)
//                                || (((sentido == 'O') || (sentido == 'E')) && semaforos[zonaX][zonaY].getMatrizInterseccionSalida()[intersecX][intersecY].getEstadoVerdeEjeX() == 1))
//                            avanza = false;
//                    }
//                }
//            }
//        }
//        //parte semaforos
//        return avanza;
//    }
//
//    public boolean esInterseccion(int x, int y) {
//        boolean esIntersec;
//        if ((x % 100 == 0) && (y % 100 == 0)) {
//            esIntersec = true;
//        } else {
//            esIntersec = false;
//        }
//        return esIntersec;
//    }
//
//    public int velocidadLimite(int x, int y, char sent) {
//        int velo = 40;
//        int xy;
//        if ((sent == 'S') || (sent == 'N')) {
//            xy = y;
//        } else if ((sent == 'O') || (sent == 'E')) {
//            xy = x;
//        } else {
//            return 40;
//        }
//        if ((xy % 500) == 0) {
//            velo = 50;
//            if ((xy % 2000) == 0) {
//                velo = 60;
//                if ((xy % 4000) == 0) {
//                    velo = 70;
//                }
//            }
//        }
//        return velo;
//    }

    public String getPlaca() {
        return placa;
    }

    public void setPlaca(String placa) {
        this.placa = placa;
    }

    public CoordCar getPosAnt() {
        return posAnt;
    }

    public void setPosAnt(CoordCar posAnt) {
        this.posAnt = posAnt;
    }

    public char getSentido() {
        return sentido;
    }

    public void setSentido(char sentido) {
        this.sentido = sentido;
    }

    public float getVelocidad() {
        return velocidad;
    }

    public void setVelocidad(float velocidad) {
        this.velocidad = velocidad;
    }

    public int getCountDetenido() {
        return countDetenido;
    }

    public void setCountDetenido(int countDetenido) {
        this.countDetenido = countDetenido;
    }

    public boolean isAlarmStop() {
        return alarmStop;
    }

    public void setAlarmStop(boolean alarmStop) {
        this.alarmStop = alarmStop;
    }

    public int getPosX() {
        return posX;
    }

    public void setPosX(int posX) {
        this.posX = posX;
    }

    public int getPosY() {
        return posY;
    }

    public void setPosY(int posY) {
        this.posY = posY;
    }

    public CoordCar getPosAct() {
        return posAct;
    }

    public void setPosAct(CoordCar posActt) {
        this.posAct = posActt;
        if (posActt != null) {
            this.setPosX(posActt.getXx());
            this.setPosY(posActt.getYy());
        } else {
            this.setPosX(-1);
            this.setPosY(-1);
        }
    }

    public CoordCar getPosPos() {
        return posPos;
    }

    public void setPosPos(CoordCar posPos) {
        this.posPos = posPos;
    }
}
